package advancedFeatures;

/**
 * Java泛型最佳实践示例
 * 1. 优先使用泛型
 * 2. 泛型命名规范
 * 3. 何时使用通配符
 * 4. 避免类型擦除带来的问题
 */
public class GenericBestPractices {
    // 好的实践：使用泛型类
    public static class Stack<T> {
        private Object[] elements;
        private int size = 0;
        
        @SuppressWarnings("unchecked")
        public Stack(int initialCapacity) {
            elements = new Object[initialCapacity];
        }
        
        public void push(T item) {
            ensureCapacity();
            elements[size++] = item;
        }
        
        @SuppressWarnings("unchecked")
        public T pop() {
            if (size == 0) throw new IllegalStateException("栈为空");
            T item = (T) elements[--size];
            elements[size] = null; // 避免内存泄漏
            return item;
        }
        
        private void ensureCapacity() {
            if (elements.length == size) {
                Object[] newElements = new Object[2 * size + 1];
                System.arraycopy(elements, 0, newElements, 0, size);
                elements = newElements;
            }
        }
    }
    
    // 展示泛型方法的正确使用
    public static <T extends Comparable<T>> T max(T x, T y) {
        return x.compareTo(y) > 0 ? x : y;
    }
    
    public static void main(String[] args) {
        // 使用泛型栈
        Stack<String> stringStack = new Stack<>(10);
        stringStack.push("First");
        stringStack.push("Second");
        
        System.out.println("弹出：" + stringStack.pop());
        
        // 使用泛型方法
        System.out.println("最大值：" + max(42, 99));
        System.out.println("最大值：" + max("hello", "world"));
    }
} 